<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>004-组件生命周期(新)</title>
  </head>
  <body>
    <div id="app"></div>

    <!-- 导入 react 主库 -->
    <script src="../js/18.2.0/react.development.js"></script>
    <!-- 导入 reactDom 扩展库 -->
    <script src="../js/18.2.0/react-dom.development.js"></script>
    <!-- 导入 babel 用于将jsx转为js -->
    <script src="../js/18.2.0/babel.min.js"></script>
    <!-- 导入 prop-types 用于对组件标签属性进行限制 -->
    <script src="../js/18.2.0/prop-types.js"></script>

    <script type="text/babel">

      /*
      *  react 17以后的版本中将要废弃 componentWillMount ComponentWillUpdate  componentWillReceiveProps    
      *  我们在使用的时候这三个钩子需要加前缀 UNSAFE_
      */

      class Count extends React.Component {
        // constructor 最先调用
        constructor(props) {
          super(props);
          console.log("Count---constructor");
        }

        // 组件挂载之前和组件更新之前 需要一个返回  返回state状态或者null
        // static getDerivedStateFromProps(props, state) {
        //   console.log('getDDerivedStateFromProps', props, state);
        //   return props
        // }

        // 组件即将更新之前 需要一个返回  返回任意值或者null   // 接收到的形参是之前或者说是上一次props的内容和state的内容
        getSnapshotBeforeUpdate(preProps, preState) {
          console.log('getDDerivedStateFromProps', preProps, preState);
          return '大树'
        }


        // 组件挂载完毕
        componentDidMount() {
          console.log("Count---componentDidMount");
        }

        // 控制组件更新的阀门(true 开启) (false 关闭)
        shouldComponentUpdate() {
          console.log("Count---shouldComponentUpdate");
          return true;
        }

        // 组件更新完毕     // 接收到的形参是之前或者说是上一次props的内容和state的内容   snapshot是 getSnapshotBeforeUpdate 传递的
        componentDidUpdate(preProps, preState, snapshot) {
          console.log("Count---componentDidUpdate",preProps, preState, snapshot);
        }

        // 组件卸载之前
        componentWillUnmount() {
          console.log("Count---componentWillUnmount");
        }

        state = {
          count: 0,
        };
        add = () => {
          this.setState({ count: this.state.count + 1 });
        };
        // 卸载组件的回调
        death = () => {
          ReactDOM.unmountComponentAtNode(document.getElementById("app"));
        };
        // 强制更新组件的回调
        force = () => {
          this.forceUpdate();
        };
        render() {
          console.log("Count---render");
          const { count } = this.state;
          return (
            <div>
              <h2>给我点击加1：{count} </h2>
              <button onClick={this.add}>加1</button>
              <button onClick={this.death}>卸载组件</button>
              <button onClick={this.force}>
                不用更新state中的状态，强制更新组件
              </button>
            </div>
          );
        }
      }

      ReactDOM.render(<Count name="st"/>, document.getElementById("app"));
    </script>
  </body>
</html>
